package com.zack.util.multitype.file.property;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class PropertyProcessing {

    /**
     * input a property file path, return this a map<key, value> of this path
     * 
     * @param propertyFilePath
     * @return
     */
    private static Map<String, String> loadProperties(String propertyFilePath) {
        Map<String, String> propertyTempMap = new LinkedHashMap<>();
        // FileUtil.getConfigParam(params, defaultValue, fileName);
        Properties properties = loadConfig(propertyFilePath);
        Set<Object> keyList = properties.keySet();
        for (Object keyObj : keyList) {
            String key = keyObj.toString();
            String value = properties.getProperty(key);
            propertyTempMap.put(key, value);
        }
        return propertyTempMap;
    }

    /**
     * 传入properties地址，获取properties对象 传入一个properties 的文件的地址， 例如项目中有个 config 文件夹， 里面有个
     * searchProject.properties文件。 然后返回一个properties对象
     * 
     * @param fileName：
     *            searchProject.properties
     * 
     *            内部方法，获取Properties对象
     * @param fileName
     *            : 注意 config文件夹， 是一个sourceFolder类型的， 假如里面有一个abc.properties 则
     *            fileName直接输入 abc.properties
     * @return
     */
    public static Properties loadConfig(String fileName) {
        Properties properties = new Properties();
        try {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            if (classLoader == null) {
                classLoader = PropertyProcessing.class.getClassLoader();
            }
            InputStream is = classLoader.getResourceAsStream(fileName);
            properties.load(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return properties;
    }

    /**
     * 传入一个properties 的文件的地址， 例如项目中有个 config 文件夹， 里面有个 searchProject.properties文件。
     * 我们需要获取这个文件里 url： jdbc.... 这一行中url后面的地址。 那么。 我们需要传入的参数： url,
     * defaultValue是指，如果不存在这个url则使用我指定的地址， fileName使用 searchProject.properties
     * 
     * @param params
     *            properties文件中的参数例如 url, username, password
     * @param defaultValue:
     *            如果在properties中不存在这个参数， 则使用我指定的，例如如果url参数不存在，则我传入一个
     *            www.baidu.com作为我要使用的url地址。
     * @param fileName
     *            是一个sourceFolder类型的， 假如里面有一个abc.properties 则 fileName直接输入
     *            abc.properties 输入其他会报错。
     * @return
     */
    public static String getConfigParam(String params, String defaultValue, String fileName) {
        String result = "";
        if (fileName.isEmpty() || params.isEmpty()) {
            return result;
        }
        try {
            Properties properties = loadConfig(fileName);
            // 例如 param=url 则获取了文件中url的地址。
            result = properties.getProperty(params);
            if (result.isEmpty()) {
                result = defaultValue;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 传入properties文件的地址,然后获取里面一个参数的值. Get the parameter value of the parameter name
     * . like getPropertyValue("abc.properties", "name") return zack;
     * 
     * @param propertyPath
     * @param paraName
     * @return
     */
    public static String getPropertyValue(String propertyPath, String paraName) {
        String paraValue = "";
        paraValue = getProperties(propertyPath).getProperty(paraName);
        return paraValue;
    }

    /**
     * 注意需要把存放properties的文件夹 变成source folder， 才行。 return the properties according to
     * your propertyPath
     * 
     * @param propertyPath
     * @return
     */
    public static Properties getProperties(String propertyPath) {
        Properties prop = new Properties();
        InputStream inputStream = ClassLoader.getSystemResourceAsStream(propertyPath);
        try {
            prop.load(inputStream);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return prop;
    }

}
